/**
 * 在 类型别名type 中，如果声明了泛型坑位，那其实就 等价于 一个接受参数的函数：
 * 
 * 下面这个 类型别名的本质 就是一个函数，T就是它的变量，返回值则是一个包含 T 的联合类型
*/
type Factory<T> = T | number | string;

//类型别名 中的泛型大多是用来进行 工具类型 封装，比如在 《11_类型工具_7、映射类型.ts》 中学习的工具类型：
type Stringify<T> = {
    [K in keyof T]: string;
};

type Clone<T> = {
    [K in keyof T]: T[K];
};

/**
 * 一个 TypeScript 的 内置工具类型Partial 
 * 工具类型 Partial 会将传入的对象类型复制一份，但会额外添加一个 ? 可选，
 * 也就是说 可以获得了一个 属性均为可选 的克隆版
*/
type Partial<T> = {
    [P in keyof T]?: T[P];
};

interface IFoo {
    prop1: string;
    prop2: number;
    prop3: boolean;
    prop4: () => void;
}

type PartialIFoo = Partial<IFoo>;

// 等价于
interface PartialIFooA {
    prop1?: string;
    prop2?: number;
    prop3?: boolean;
    prop4?: () => void;
}

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }